/**
 *
 *
 **/

package mwt.xml.xdbforms.dblayer.query;

import java.util.Collection;
import mwt.xml.xdbforms.dblayer.query.exception.QueryException;
import mwt.xml.xdbforms.dblayer.query.impl.SQLInsert;
import mwt.xml.xdbforms.dblayer.query.impl.SQLQuery;
import mwt.xml.xdbforms.dblayer.query.impl.SQLUpdate;


/**
 *
 * Definisce un'interfaccia per le query
 * al database. Le implementazioni
 * delle interfaccie useranno JDBC per eseguire
 * le operazioni CRUD sul database

 * @author Gianfranco Murador
 */

public interface Query {

  
    /**
     * Fa un inserimento di una riga nel database
     * <i>Example:</i><br>
     * Query q = ...; <br>
     * q.insert(new SQLInsert(...));<br>
     * @param sqlo oggetto di tipo SQLOperation (classe astratta). Usare
     * la sottoclasse SQLInsert.
     * @see SQLInsert
     * @throws mwt.xml.xdbforms.dblayer.query.exception.QueryException
     */
    void insert(SQLOperation sqlo) throws QueryException;

     /**
      * Fa un'aggiornamento di una riga della tabella. I parametri
      * dell'oggetto SQLUpdate definiti come chiave primaria
      * non verranno modficati!<br>
      * <i>Example:</i><br>
      * Query q = ...;<br>
      * q.update(new SQLUpdate(...));<br>
      * @param sqlo da eseguire. Oggetto che implementa la classe
      * astratta SQLOperation. Usare la sottoclasse SQLUpdate.
      * @see SQLUpdate
      * @throws mwt.xml.xdbforms.dblayer.query.exception.QueryException
      */

    void update(SQLOperation sqlo) throws QueryException;

    
    /**
     * Fa una lettura dal database effettuando una select
     * @param table nome della tabella
     * @throws QueryException
     * @return ritorna il ResultSet di risposta
     **/

     Collection read(String table) throws QueryException;

     /**
      *
      * @param table Nome della tabella
      * @param start indica da quale riga della tabella partire
      * @param length il numero di righe da visualizzare
      * @return ritorna una collection di risposta
      * @throws mwt.xml.xdbforms.dblayer.query.exception.QueryException
      */

     Collection read(String table,int start, int length) throws QueryException;


     /**
      * Fai una read specificando un oggetto SQLOperation.<br>
      * <i>Example:</i><br>
      * Query q = ...;<br>
      * q.read(new SQLQuery(...));<br>
      * @param sqlo oggetto che implementa la classe astratta SQLOperation.Usare
      * la classe SQLQuery in input.
      * @see SQLQuery
      * @return una collection con i risutati della query
      * @throws mwt.xml.xdbforms.dblayer.query.exception.QueryException
      */

     Collection read(SQLOperation sqlo) throws QueryException;



     String getInsertStmt(SQLOperation sqlo) throws QueryException;

     String getUpdateStmt(SQLOperation sqlo) throws QueryException;
    
}
